#!/bin/bash

# 定义一个函数，用于显示git log
display_git_log() {
    while true; do
        read -p "请输入要查看的提交次数（默认为10次，直接按回车使用默认值）：" log_count
        if [ -z "$log_count" ]; then
            log_count=10
            echo "显示最近的10次提交信息："
        elif [[ "$log_count" =~ ^[0-9]+$ ]]; then
            echo "显示最近的$log_count次提交信息："
        else
            echo "错误: 提交次数必须是正整数，请重新输入。"
            continue
        fi

        # 执行git log命令，显示指定次数的提交信息
        git log -$log_count --oneline "$input_branch"
        echo ""
        break
    done
}


# 检查参数是否有效
if [ "$#" -ne 1 ] || { [ "$1" != "-u" ] && ! [[ "$1" =~ ^[0-9]+$ ]]; }; then
    echo -e "\n用法: "
    echo "方法1：一键生成commit包: $0 <提交次数>"
    echo "方法2：交互模式生成commit包: $0 -u"
    exit 1
fi

# 检查是否为交互模式
if [ "$1" == "-u" ]; then
    echo -e "\n进入交互模式，请按照提示操作："

    # 获取所有分支名称
    # git fetch --all
    branches=$(git branch -a | sed 's/^\*//g' | sed 's/^\s*//g' | sort -u)
    echo -e "\n可用的分支列表："
    echo "$branches"

    # 获取当前分支名
    current_branch=$(git rev-parse --abbrev-ref HEAD)
    echo -e "\n按下回车使用当前分支：$current_branch，或输入其他分支名称后按下回车。"

    # 循环直到获得有效的分支名
    while true; do
        read -p "请输入分支名称： " input_branch
        if [ -z "$input_branch" ]; then
            input_branch=$current_branch
            echo "使用当前分支：$current_branch"
            break
        elif echo "$branches" | grep -q "^$input_branch$"; then
            git checkout "$input_branch"
            echo "切换到分支：$input_branch"
            # Debug 输出当前分支
            echo "当前所处分支：$(git branch --show-current)"
            # 验证是否成功切换到目标分支
            if [ "$(git branch --show-current)" != "$input_branch" ]; then
                echo "错误: 无法切换到分支 '$input_branch'，请检查分支名称是否正确,或代码是否已经提交。"
                exit 1
            fi
            break
        else
            echo "错误: 输入的分支名无效，请重新输入。"
        fi
    done

    display_git_log

    # 接着提示用户输入用于生成commit包的提交次数，允许使用默认值
    while true; do
        read -p "请输入用于生成commit包的提交次数（默认5次，直接按回车使用默认值，或输入 'log' 查看更多提交记录）： " number_of_commits
        if [[ "$number_of_commits" == "log" ]]; then
            display_git_log  # 用户输入log时，调用函数重新显示git log
        elif [ -z "$number_of_commits" ]; then
            number_of_commits=5
            echo "使用默认提交次数：5次"
            break
        elif [[ "$number_of_commits" =~ ^[0-9]+$ ]]; then
            echo "使用指定提交次数：$number_of_commits次"
            break
        else
            echo "错误: 提交次数必须是正整数，请重新输入。"
        fi
    done

else
    number_of_commits=$1
    current_branch=$(git rev-parse --abbrev-ref HEAD)
fi

# 获取当前分支名
current_branch=$(git rev-parse --abbrev-ref HEAD)

echo "获取到的分支名: $current_branch"

# 获取最近的提交SHA1值
commit_hashes=$(git log -"$number_of_commits" --format="%H")

# 获取起始和结束的 SHA1，只保留前8位
start_sha=$(echo "$commit_hashes" | tail -n 1 | cut -c1-8)
end_sha=$(echo "$commit_hashes" | head -n 1 | cut -c1-8)

echo "获取到的起始SHA1: $start_sha"
echo "获取到的结束SHA1: $end_sha"

# 用于存储tag信息
tag_names=""

# 遍历每个commit获取所有纯净的tag
while read -r commit_hash; do
    tag=$(git describe --tags "$commit_hash" 2>/dev/null | sed -E 's/([^-]*).*/\1/')
    if [ -n "$tag" ]; then
        # 确保不重复添加相同的tag
        if [[ "$tag_names" != *"$tag"* ]]; then
            tag_names+="$tag "
        fi
    fi
done <<< "$(echo "$commit_hashes")"

# 如果没有找到任何tag，tag_names设为空
if [ -z "$tag_names" ]; then
    tag_names=""
fi

echo "获取到的tag信息: $tag_names"

# 获取当前目录名作为应用名称
app_name=$(basename "$(pwd)")

# 构造bundle文件名和命令
bundle_name="${app_name}_${current_branch}_${start_sha}..${end_sha}.bundle"
bundle_command="git bundle create $bundle_name $start_sha..$end_sha $current_branch $tag_names"

# 执行命令
echo -e "\ncommit包创建命令: $bundle_command"
$bundle_command

echo -e "\n创建的commit包名称: $bundle_name"


# 查看commit包信息
echo
echo -e "\ncommit包信息:"
git bundle list-heads "$bundle_name"